home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 34.zip / BS1 part 34 / FredFish PD 314.adf / Zc / zcsrc.lzh / IOLib / misc / system.c < prev    next >
C/C++ Source or Header  |  1988-11-09  |  1KB  |  78 lines

  1. #include <osbind.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <basepage.h>
  5.  
  6. static parse_args(cmdln, argv)
  7.     char *cmdln;
  8.     register char *argv[];
  9.     {
  10.     register char *p;
  11.     static char delim[] = " \t\r\n";
  12.  
  13.     if(p = strtok(cmdln, delim))
  14.         {
  15.         do
  16.             {
  17.             *argv++ = p;
  18.             }
  19.             while(p = strtok(NULL, delim));
  20.         }
  21.     }
  22.  
  23. int system(command)
  24.     register char *command;
  25.     {
  26.     register char *p;
  27.     register int (*shell)();
  28.     char rv[2];
  29.     char cmdln[1024];
  30.     char *args[64];
  31.     char *getenv();
  32.  
  33.     if(!command)
  34.         return(ERROR);
  35.  
  36.     /* get _shell_p value */
  37.     p = (char *) Super(0L);
  38.     shell = (int (*)()) *((long *) 0x4F6L);
  39.     Super(p);
  40.  
  41.     /* validate _shell_p */
  42.     if((shell) &&                /* Shell available. */
  43.        (((long) shell) < ((long) _base)) &&    /* Reasonable shell pointer. */
  44.        (strncmp(shell, "PATH", 4)))        /* Not corrupted */
  45.         {
  46.         /* execute the command */
  47. #ifdef DEBUG
  48. _COOKIE("system: using _shell_p");
  49. #endif
  50.         return((*shell)(command));
  51.         }
  52.  
  53.     strcpy(cmdln, command);    /* copy the command line for parsing */
  54.  
  55.     if((p = getenv("SHELL")) && (*p))    /* SHELL= variable? */
  56.         {
  57.         args[0] = p;
  58.         parse_args(cmdln, (args + 1));
  59. #ifdef DEBUG
  60. _COOKIE("system: executing SHELL");
  61. _COOKIE(p);
  62. #endif
  63.         }
  64.     else    /* attempt to find first token as a program on the path */
  65.         {
  66.         parse_args(cmdln, args);
  67.         p = args[0];
  68. #ifdef DEBUG
  69. _COOKIE("system: directly executing program");
  70. _COOKIE(p);
  71. #endif
  72.         }
  73.  
  74.     forkvpe(p, args, NULL);
  75.     wait(rv);
  76.     return((rv[1] == 0) ? rv[0] : rv[1]);
  77.     }
  78.